/**************************************** Simple Mesh Combine v1.61 Copyright 2015 Unluck Software www.chemicalbliss.com *****************************************/ @script AddComponentMenu("Simple Mesh Combine") #pragma strict #pragma downcast var combinedGameOjects:GameObject[]; //Stores gameObjects that has been merged, mesh renderer disabled var combined:GameObject; //Stores the combined mesh gameObject var meshName:String = "Combined_Meshes"; //Asset name when saving as prefab var _canGenerateLightmapUV:boolean; var vCount:int; var generateLightmapUV:boolean; var copyTarget:GameObject; var destroyOldColliders:boolean; var keepStructure:boolean = true; function EnableRenderers(e:boolean) { for (var i:int = 0; i < combinedGameOjects.length; i++){ combinedGameOjects[i].GetComponent.().enabled = e; } } //Returns a meshFilter[] list of all renderer enabled meshfilters(so that it does not merge disabled meshes, useful when there are invisible box colliders) function FindEnabledMeshes(){ var renderers:MeshFilter[]; var count:int; renderers = transform.GetComponentsInChildren.(); //count all the enabled meshrenderers in children for (var i:int = 0; i < renderers.length; i++) { if(renderers[i].GetComponent(MeshRenderer) && renderers[i].GetComponent(MeshRenderer).enabled) count++; } var meshfilters = new MeshFilter[count];//creates a new array with the correct length count = 0; //adds all enabled meshes to the array for (var ii:int = 0; ii < renderers.length; ii++) { if(renderers[ii].GetComponent(MeshRenderer) && renderers[ii].GetComponent(MeshRenderer).enabled){ meshfilters[count] = renderers[ii]; count++; } } return meshfilters; } function CombineMeshes() { var combo:GameObject = new GameObject(); combo.name = "_Combined Mesh [" + name + "]"; combo.gameObject.AddComponent(MeshFilter); combo.gameObject.AddComponent(MeshRenderer); var meshFilters:MeshFilter[]; meshFilters = FindEnabledMeshes(); var materials: ArrayList = new ArrayList(); var combineInstanceArrays: ArrayList = new ArrayList(); combinedGameOjects = new GameObject[meshFilters.length]; for (var i = 0; i < meshFilters.length; i++) { var meshFilterss: MeshFilter[] = meshFilters[i].GetComponentsInChildren.(); combinedGameOjects[i] = meshFilters[i].gameObject; for (var meshFilter: MeshFilter in meshFilterss) { var meshRenderer: MeshRenderer = meshFilter.GetComponent(MeshRenderer); meshFilters[i].transform.gameObject.GetComponent(Renderer).enabled = false; for (var o: int = 0; o < meshFilter.sharedMesh.subMeshCount; o++) { if(o < meshRenderer.sharedMaterials.Length && o < meshFilter.sharedMesh.subMeshCount){ var materialArrayIndex: int = Contains(materials, meshRenderer.sharedMaterials[o]); if (materialArrayIndex == -1) { materials.Add(meshRenderer.sharedMaterials[o]); materialArrayIndex = materials.Count - 1; } combineInstanceArrays.Add(new ArrayList()); var combineInstance: CombineInstance = new CombineInstance(); combineInstance.transform = meshRenderer.transform.localToWorldMatrix; combineInstance.subMeshIndex = o; combineInstance.mesh = meshFilter.sharedMesh; (combineInstanceArrays[materialArrayIndex] as ArrayList).Add(combineInstance); } #if UNITY_EDITOR else{ Debug.LogWarning("Simple Mesh Combine: GameObject [ " +meshRenderer.gameObject.name + " ] is missing a material (Mesh or sub-mesh ignored from combine)"); } #endif } } #if UNITY_EDITOR EditorUtility.DisplayProgressBar("Combining", "", i); #endif } var meshes: Mesh[] = new Mesh[materials.Count]; var combineInstances: CombineInstance[] = new CombineInstance[materials.Count]; for (var m: int = 0; m < materials.Count; m++) { var combineInstanceArray: CombineInstance[] = (combineInstanceArrays[m] as ArrayList).ToArray(typeof(CombineInstance)) as CombineInstance[]; meshes[m] = new Mesh(); meshes[m].CombineMeshes(combineInstanceArray, true, true); combineInstances[m] = new CombineInstance(); combineInstances[m].mesh = meshes[m]; combineInstances[m].subMeshIndex = 0; } combo.GetComponent(MeshFilter).sharedMesh = new Mesh(); combo.GetComponent(MeshFilter).sharedMesh.CombineMeshes(combineInstances, false, false); for (var mesh: Mesh in meshes) { mesh.Clear(); DestroyImmediate(mesh); } var meshRendererCombine: MeshRenderer = combo.GetComponent(MeshFilter).GetComponent(MeshRenderer); if (!meshRendererCombine) meshRendererCombine = gameObject.AddComponent(MeshRenderer); var materialsArray: Material[] = materials.ToArray(typeof(Material)) as Material[]; meshRendererCombine.materials = materialsArray; combined = combo.gameObject; EnableRenderers(false); combo.transform.parent = transform; #if UNITY_EDITOR if(generateLightmapUV){ Unwrapping.GenerateSecondaryUVSet(combo.GetComponent(MeshFilter).sharedMesh); } #endif vCount = combo.GetComponent(MeshFilter).sharedMesh.vertexCount; if(vCount > 65536) { Debug.LogWarning("Vertex Count: " +vCount + "- Vertex Count too high, please divide mesh combine into more groups. Max 65536 for each mesh" ); _canGenerateLightmapUV = false; }else{ _canGenerateLightmapUV = true; } #if UNITY_EDITOR EditorUtility.ClearProgressBar(); #endif } function Contains(l: ArrayList, n: Material) { for (var i: int = 0; i < l.Count; i++) { if ((l[i] as Material) == n) { return i; } } return -1; }